#include "UdpServer.hpp"
#include "User.hpp"

// ./server_udp localport
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " localport" << std::endl;
        Die(USAGE_ERR);
    }
    // std::string ip = argv[1];
    uint16_t port = std::stoi(argv[1]);

    // ENABLE_CONSOLE_LOG();

    // 用户管理模块
    std::shared_ptr<UserManager> um = std::make_shared<UserManager>();
    // 网络模块
    std::unique_ptr<UdpServer> svr_uptr = std::make_unique<UdpServer>(port);
    svr_uptr->RegisterService([&um](InetAddr &id){ um->AddUser(id); },
                              [&um](int sockfd, const std::string &message){ um->Router(sockfd, message);},
                              [&um](InetAddr &id){ um->DelUser(id);}
                              );
    svr_uptr->InitServer();

    svr_uptr->Start();

    return 0;
}



// //用户管理模块
// #include "User.hpp"
// //服务器模块
// #include "UdpServer.hpp"

// int main(int argc, char* argv[])
// {
//     if(argc != 2){
//         // LOG(LogLevel::FATAL) 
//         std::cerr << "Usage: " << argv[0] << " PORT" << std::endl;
//         Die(err::USE_ERR);
//     }

//     uint16_t port = std::stoi(argv[1]);
    
//     LOG_CONSOLE;

//     std::shared_ptr<UserManager> users_sptr = std::make_shared<UserManager>();

//     // 利用 User板块里面的方法注册服务器处理逻辑
//     std::unique_ptr<UdpServer> svr_uptr = std::make_unique<UdpServer>(
//         /* register functors to Server*/
//     [&users_sptr](InetAddr &addr)
//     {
//         users_sptr->AddUser(addr);
//     },
//     [&users_sptr](InetAddr &addr)
//     {
//         users_sptr->DelUser(addr);
//     },
//     [&users_sptr](int sockfd, const std::string &msg)
//     {
//         users_sptr->Router(sockfd, msg);
//     },
//     port);
    
//     svr_uptr->InitServer();
//     svr_uptr->Start();

//     return 0;
// }